perm filename STEP.6[DOC,TOB] blob sn#082209 filedate 1974-01-07 generic text, type T, neo UTF8
00100	comment this file generates fake edges in an array;
00200	
00300	
00400	
00500		comment conditional assembly to compile file only once;
00600	IFCR ¬DECLARATION(FAKE_COMPILED) THENC
00700	  DEFINE FAKE_COMPILED=1;
00800		comment flag used to prevent reading file twice;
00900	  comment
01000		this package generates fake edges in an array
01100		The variables involved are:
01200			BITS	number of bits per byte
01300			STEP_FAKE    the step half height
01400			RATIO_FAKE	fractional half height
01500				STEP_FAKE←RATIO_FAKE*NOISE_FAKE
01600			MEAN_FAKE	mean value of step
01700			NOISE_FAKE	rms error of gaussian noise
01800	
01900			THETA_FAKE		angle of edge
02000				THETA_FAKE←THETA0_FAKE+DTHETA_FAKE*(RANDOM-.5)
02100				DTHETA_FAKE	interval of random theta variation
02200				THETA0_FAKE	center value of theta
02300	
02400			RHO_FAKE		perpendicular distance of edge
02500				RHO_FAKE←RHO0_FAKE+DRHO_FAKE*(RANDOM-.5)
02600				DRHO_FAKE	interval of random rho variation
02700				RHO0_FAKE	center value of rho
02800			LAMBDA_FAKE		the wavelength transverse to edge
02900			INTENSITY_FAKE	array of fake INTENSITY_FAKE values
03000			NBHD_FAKE	size of nbhd (intensity array)
03100	
03200		  PROCEDURE ASK_FAKE ! asks for values for variables
03300		  SIMPLE PROCEDURE ERROR_FAKE(REFERENCE REAL ALPHA,DELTA)
03400			comment gets values for angle,perpendicular distance
03500	
03600	  the perpendicular distance from the edge is
03700		n→.r→+RHO_FAKE
03800		cx*x+cy*y+RHO_FAKE
03900	  in terms of normal;
     

00100	  REQUIRE RANDOM_FILE;
00200	  REQUIRE TV_VARIABLES;
00300	
00400	  DEFINE NBHD_FAKE=8;
00500	  SHORT REAL STEP_FAKE;	! half height of fake edge;
00600	  SHORT REAL RATIO_FAKE;		! fraction of noise;
00700		comment STEP_FAKE←RATIO_FAKE*NOISE_FAKE;
00800	  SHORT REAL MEAN_FAKE;		! mean value at edge;
00900	  SHORT REAL NOISE_FAKE;		! rms error of gaussian noise;
01000	  SHORT REAL THETA_FAKE;		! angle of fake edge;
01100		comment theta_fake←theta0_fake+dtheta_fake;
01200	  SHORT REAL DTHETA_FAKE;	! interval of flat random distribution;
01300	  SHORT REAL THETA0_FAKE;	! center value of theta;
01400	  SHORT REAL RHO_FAKE;		! normal distance of edge from origin;
01500		comment rho_fake←rho0_fake+drho_fake;
01600	  SHORT REAL RHO0_FAKE;	! central value of rho;
01700	  SHORT REAL DRHO_FAKE;	! interval of flat random rho distribution;
01800	  SHORT REAL LAMBDA_FAKE;		! wavelength transverse to edge;
01900	  INTEGER_ARRAY INTENSITY_FAKE[1:NBHD_FAKE*NBHD_FAKE];
02000	
02100	
02200	  PROCEDURE INIT_FAKE;
02300	    BEGIN
02400	    BITS←9;
02500	    TVWORD←GIOWD(INTENSITY_FAKE);
02600	    LINLEN←WORDS(NBHD_FAKE,BITS);
02700	    IWID←NBHD_FAKE;
02800	    LSIDE←1;RSIDE←NBHD_FAKE;
02900	    FLINE←1;LLINE←NBHD_FAKE;
03000	    RATIO_FAKE←1.0;
03100	    MEAN_FAKE←0.5*(2↑BITS-1);
03200	    THETA0_FAKE←.5;   ! fraction of maximum;
03300	    DTHETA_FAKE←1.0;  ! fraction of maximum;
03400	    RHO0_FAKE←0.5;
03500	    DRHO_FAKE←1.0;
03600	    LAMBDA_FAKE←1.0;
03700	    NOISE_FAKE←5.0;
03800	    END;
03900	
04000	  REQUIRE INIT_FAKE INITIALIZATION;
04100	
04800	  SHORT REAL PROCEDURE NOISE(SHORT REAL VALUE,NOISE_FAKE);
04900	  comment gaussian noise;
05100	    RETURN (VALUE+GAUSS*NOISE_FAKE);
05300	
05400	  SHORT REAL PROCEDURE STEP_FUN(SHORT REAL MEAN_FAKE,
05500		STEP_FAKE,PHASE);
05600	  comment step function with linear shift between;
05700	    BEGIN "STEP"
05800	    IF PHASE>1.0 THEN PHASE←1.0;
05900	    IF PHASE<-1.0 THEN PHASE←-1.0;
06000	    RETURN (PHASE*STEP_FAKE+MEAN_FAKE);
06100	    END "STEP";
06200	
06300	  SHORT REAL PROCEDURE NOISY_STEP( SHORT REAL MEAN_FAKE,
06400		STEP_FAKE,PHASE,NOISE_FAKE);
06500	  comment noisy step function;
06700	    RETURN(NOISE(STEP_FUN(MEAN_FAKE,STEP_FAKE,PHASE),NOISE_FAKE));
06900	
07100	  PROCEDURE ASK_FAKE; ! asks for values for variables;
07105	  WHILE YES("CHANGE FAKE VALUES? ") DO BEGIN "ASK_F"
07300	    ASK_MODIFY("AMPLITUDE IN UNITS OF NOISE ",RATIO_FAKE);
07400	    MODIFY(NOISE_FAKE);
07500	    STEP_FAKE←NOISE_FAKE*RATIO_FAKE;
07600	    IF STEP_FAKE=0 THEN STEP_FAKE←RATIO_FAKE;
07700	    PRINT(STEP_FAKE);
07800	    ASK_MODIFY("TRANSVERSE WAVELENGTH (FOR DEFOCUS) ",LAMBDA_FAKE);
07900	    MODIFY(RHO0_FAKE);
08000	    MODIFY(DRHO_FAKE);
08100	    ASK_MODIFY("FRACTION OF MAXIMUM ",THETA0_FAKE);
08200	    ASK_MODIFY("FRACTION OF MAXIMUM ",DTHETA_FAKE);
08300	    END "ASK_F";
08400	
08500	
08600	
08700	  SIMPLE PROCEDURE ERROR_FAKE(REFERENCE REAL ALPHA,DELTA);
08800	    BEGIN
08900	    REAL COSX,COSY;
09000	
09100	    ALPHA←ATAN2(CY,CX)-THETA_FAKE;
09200	    COSX←COS(THETA_FAKE);
09300	    COSY←SIN(THETA_FAKE);
09400	    DELTA←COSX*(OPX-NBHD_FAKE/2)+COSY*(OPY-NBHD_FAKE/2)+RHO_FAKE;
09500	    END;
     

00100	  comment make a step edge (with funarg possibly)
00200		about a line specified by
00300		THETA_FAKE,RHO_FAKE with wavelength LAMBDA_FAKE;
00400	
00500	  PROCEDURE FAKE;
00600	    BEGIN "FAKE"
00700	    REAL X0,Y0,COSX,COSY;
00800	    SHORT INTEGER VMAX;
00900	    INTEGER PTR;	! byte ptr;
01000	    INTEGER ROW,COLUMN;
01100	
01200	    THETA_FAKE←(THETA0_FAKE+DTHETA_FAKE*(RANDOM-.5))*π/8;
01300	    RHO_FAKE←RHO0_FAKE+DRHO_FAKE*(RANDOM-.5);
01400	    VMAX←2↑BITS-1;
01500	    COSX←COS(THETA_FAKE);
01600	    COSY←SIN(THETA_FAKE);
01700	    X0←(NBHD_FAKE+1)*0.5;
01800	    Y0←(NBHD_FAKE+1)*0.5;
01900	    PTR←BPOINT(BITS,INTENSITY_FAKE[1],0);
02000	
02100	    FOR ROW←1 STEP 1 UNTIL NBHD_FAKE DO BEGIN
02200	      SHORT REAL Y1;
02300	      INTEGER PTR1;
02400	      PTR1←PTR;
02500	      PTR←PTR+LINLEN;
02700	      Y1←(ROW-Y0)*COSY+RHO_FAKE;
02800	      FOR COLUMN←1 STEP 1 UNTIL NBHD_FAKE DO BEGIN
02900	        LABEL FKSTR;
03000		SHORT REAL PHASE;
03100		SHORT INTEGER VALUE;
03200		PHASE←(Y1+(COLUMN-X0)*COSX)/LAMBDA_FAKE; ! transverse phase;
03300				comment now calculate fake intensity;
03400		VALUE←0.5+NOISY_STEP(MEAN_FAKE,STEP_FAKE,PHASE,NOISE_FAKE);
03500			comment now round value and check limits, store;
03600		IF VALUE<0 THEN VALUE←0;
03700		IF VALUE>VMAX THEN VALUE←VMAX;
03800		FKSTR:	IDPB(VALUE,PTR1);
03900	        END;
04000	      END;
04100	    END "FAKE";
04200	
04300	
04400	
04500	  ENDC;	! end of conditional assembly around whole file;